package com.zj.musicTools.function

import android.util.Log
import com.zj.musicTools.MainActivity.Companion.Agent
import java.io.File
import java.util.concurrent.ExecutorService


/**
 * 功能： 音乐加密文件解析
 * 参数：
 *          inFile：输入文件绝对路径（可以是目录或文件）
 *          outFile：输出文件绝对路径（只能是目录）
 *          autoRun：创建类时自动转换
 *          callback: 回调函数
 * 用法：
 *      创建类的时候输入文件路径和输出文件路径（非必要），默认在创建类时自动运行一次转换。
 *      未设置输出路径则输出到原路径
 *      当autoRun为true时，必须传递callback函数，保证正常运行
* */

class Decrypt(
    inFile:String,
    outFile: String= "",
    autoRun:Boolean=true,
    callback: ((Result<String>) -> Unit)?,
    private val executor: ExecutorService =Agent.executorService) {
    private var inFile:String
    private  var outFile:String
//    private lateinit var succeedlist:Array<String>

    constructor(inFile:String,
                outFile: String= ""):this(inFile,outFile,false,null){

    }
    init {
        this.inFile = inFile
        this.outFile=(outFile.ifEmpty { inFile }).getDir()

        if (autoRun && callback == null) {
            throw IllegalArgumentException("autoRun模式下需要设置callback值！")
        }
        else if (existFile(inFile) && autoRun && callback != null)run(callback=callback)

        else if(!existFile(inFile)) {
            Log.e("Error","文件不存在："+inFile)
            Agent.newLog("文件不存在："+inFile)
        }

    }

    private fun String.getDir() : String{
        return try {
            var pathbuf = this
            var file= File(this)

            if(file.isFile){//若输入为文件名，去掉文件名
                pathbuf=pathbuf.take(pathbuf.lastIndexOf("/")) //取路径
                file= File(pathbuf)
            }
            if(!file.isFile){ //若是路径名称，先检查路径是否存在，不存在则新建路径
                if(!file.exists()) file.mkdir()
            }
             pathbuf
        }catch (e:Exception){
            this
        }
    }

    private fun existFile(file:String):Boolean{
        val filer = File(file)
        return filer.exists()
    }

    /*fun run(file: String=this.inFile, outfile: String=this.outFile): String{
        Log.i("Decrypt","filePath:"+file+", outPath:"+outfile)
        val rtlog= Agent.decryptMusic(file,outfile)
//        Agent.log(rtlog) //log输出到文件中//后期需要在这把里面的json数据解析，拆分输出

        return rtlog
    }*/
    fun run(INPUT:String=this.inFile,
                   OUTPUT:String=this.outFile,
                   callback:(Result<String>)->Unit
    ){
        executor.submit{
            try {
                Log.i("Decrypt","filePath:"+INPUT+", outPath:"+OUTPUT)
                val catchData= Agent.decryptMusic(INPUT,OUTPUT)

                val backStat=Agent.log(catchData) //log输出到文件中
                if(backStat)
                    callback(Result.success(catchData))
                else {
                    val e=NullPointerException()
                    val err= Result.failure<String>(e)
                    callback(err)
                }

            }catch (e:Exception){
                val err= Result.failure<String>(e)
                callback(err)
            }

        }
    }
/*    fun getList(): Array<String> {
        return succeedlist
    }
    fun setList(listMsg:String) {
         succeedlist=listMsg.
    }*/

    fun InFile(file:String):Boolean{
        val filer= File(file)
        if(!filer.isFile)return false

        this.inFile=file
        return true
    }
    fun OutFile(file: String){
        this.outFile=file.getDir()
    }


}